/**
 * Copyright (C), 2012-2022，DapTech.
 * @title FastJsonUtils.java
 * @package com.dt.serialize.fastjson
 * @Description 
 * @author RID
 * @date Mon, 24 Jul 2017 01:02:22, GMT+8
 * @date 2017.07.24 01:02:22 GMT+8
 * @version v1.0
 * History:
 *	1. Date: 2017年7月24日 上午1:02:22
 *     Author: RID
 *     Modification: TODO
 *  2. ...
 */
package com.firmail.mock.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.alibaba.fastjson.serializer.JSONLibDataFormatSerializer;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;

import java.util.List;
import java.util.Map;

/**
 * FastJson采用独创的算法，将parse的速度提升到极致，超过所有json库
<p>//下面是FastJson的简介：常用的方法！
<br/>//  Fastjson API入口类是com.alibaba.fastjson.JSON，常用的序列化操作都可以在JSON类上的静态方法直接完成。
<br/>//  public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray 
<br/>//  public static final JSONObject parseObject(String text)； // 把JSON文本parse成JSONObject    
<br/>//  public static final <T> T parseObject(String text, Class<T> clazz); // 把JSON文本parse为JavaBean 
<br/>//  public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray 
<br/>//  public static final <T> List<T> parseArray(String text, Class<T> clazz); //把JSON文本parse成JavaBean集合 
<br/>//  public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本 
<br/>//  public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本 
<br/>//  public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray（和上面方法的区别是返回值是不一样的）
 * @name FastJsonUtils
 * @description FastJson在复杂类型的Bean转换Json上会出现一些问题，可能会出现引用的类型，导致Json转换出错
 * @author RID
 * @date Mon, 24 Jul 2017 01:02:22
 *
 */
public class FastJsonUtils {

	private static final SerializeConfig config;

	static {
		config = new SerializeConfig();
		config.put(java.util.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式
		config.put(java.sql.Date.class, new JSONLibDataFormatSerializer()); // 使用和json-lib兼容的日期输出格式
	}

	private static final SerializerFeature[] features = { SerializerFeature.WriteMapNullValue, // 输出空置字段
			SerializerFeature.WriteNullListAsEmpty, // list字段如果为null，输出为[]，而不是null
			SerializerFeature.WriteNullNumberAsZero, // 数值字段如果为null，输出为0，而不是null
			SerializerFeature.WriteNullBooleanAsFalse, // Boolean字段如果为null，输出为false，而不是null
			SerializerFeature.WriteNullStringAsEmpty, // 字符类型字段如果为null，输出为""，而不是null

			// SerializerFeature.WriteClassName,
			SerializerFeature.WriteDateUseDateFormat
			// SerializerFeature.WriteEnumUsingToString,
			// SerializerFeature.WriteSlashAsSpecial,
	};
	
	/**
	 * feature: ...
	 * @since Mon, 24 Jul 2017 16:21:37
	 */
	public static <T> String toJSONWithFeatures(T object) {
		return JSON.toJSONString(object, config, features);
	}

	/**
	 * 未更改特征参数
	 * @since Mon, 24 Jul 2017 02:21:08
	 */
	public static <T> String toJSON(T object) {
		return JSON.toJSONString(object, config);
	}
	/**
	 * 把JSON文本parse为JSONObject-Map/JSONArray-List
	 * @since Mon, 24 Jul 2017 02:21:08
	 */
	public static Object parse(String text) {
		return JSON.parse(text);
	}

	public static JSONObject parseObject(String json){
		return JSONObject.parseObject(json);
	}

	public static String toJSONString(JSONObject object){
		return object.toJSONString();
	}
	/**
	 * obtain the object T 
	 * @since Mon, 24 Jul 2017 16:30:07
	 */
	public static <T> T parseJson(String text, Class<T> clazz) {
		return JSON.parseObject(text, clazz);
	}

	/** 
	 * 把JSON文本parse成JSONArray 数组元素为JSONObject即Map，
	 */
	public static <T> Object[] parseArray(String text) {
		return JSON.parseArray(text).toArray();
	}

	/** 
	 * 把JSON文本parse成JSONArray,然后转换成Object[]数组,数组元素类型T
	 * @see #parseArray
	 */
	public static <T> T[] parseArrayOButEleIsTypeT(String text, Class<T> clazz, T[] arr) {
		return JSON.parseArray(text, clazz).toArray(arr);
	}

	/**
	 * 功能描述：把JSON数据转换成指定的java对象列表List<T>
	 * @see #parseArrayOButEleIsTypeT
	 */
	public static <T> List<T> parseArray(String jsonData, Class<T> clazz) throws Exception {
		return JSON.parseArray(jsonData, clazz);
	}

	/**
	 *  仅仅把参数为JSON<code>{"jj":17,"qq":19}</code>文本parse成JSONObject-Map
	 * @see #parse
	 */
	public static Map<String, Object> parseMap(String s) {
		Map<String, Object> m = JSONObject.parseObject(s);
		return m;
	}

	/**
	 * 只能将map转化为string，<code>{"jj":17,"qq":19}</code>
	 */
	public static String toJSON(Map<String, Object> m) {
		String s = JSONObject.toJSONString(m);
		return s;
	}

	/**
	 * 功能描述：把JSON数据转换成较为复杂的java对象列表<code>List&lt;Map&lt;K, V>></code>
	 * @param jsonData e.g. [{jj=17, qq=19}, {jj=17, qq=19}]

	 */
	public static <K, V> List<Map<K, V>> parseJsonToListMaps(String jsonData) throws Exception {
		return JSON.parseObject(jsonData, new TypeReference<List<Map<K, V>>>() {
		});
	}

}